home *** CD-ROM | disk | FTP | other *** search
/ ASME's Mechanical Engine…ing Toolkit 1997 December / ASME's Mechanical Engineering Toolkit 1997 December.iso / c_lang / z150_src.lzh / NIXTIME.I < prev    next >
Encoding:
Text File  |  1987-07-12  |  3.3 KB  |  97 lines

  1. #ifndef LINT
  2. static char nixtimeid[]="@(#) nixtime.i 1.2 87/05/03 16:00:16";
  3. #endif /* LINT */
  4.  
  5. /*
  6. Time handling routines for UNIX systems.  These are included by the file
  7. machine.c as needed.
  8.  
  9. The contents of this file are hereby released to the public domain.
  10.  
  11.                                     -- Rahul Dhesi  1986/12/31
  12. */
  13.  
  14. struct tm *localtime();
  15.  
  16. /*****************
  17. Function gettime() gets the date and time of the file handle supplied.
  18. Date and time is in MSDOS format.
  19. */
  20. gettime(handle,date,time)
  21. int handle, *date, *time;
  22. {
  23.    struct stat buf;           /* buffer to hold file information */
  24.    struct tm *tm;             /* will hold year/month/day etc. */
  25.    if (fstat (handle, &buf) == -1) {
  26.       prterror ('w', "Could not get file time\n");
  27.       *date = *time = 0;
  28.    } else {
  29.       tm = localtime (&buf.st_mtime); /* get info about file mod time */
  30.       *date = tm->tm_mday + ((tm->tm_mon + 1) << 5) + 
  31.          ((tm->tm_year - 80) << 9);
  32.       *time = tm->tm_sec / 2 + (tm->tm_min << 5) +
  33.          (tm->tm_hour << 11);
  34.    }
  35.  
  36. }
  37.  
  38. /*****************
  39. Function setutime() sets the date and time of the filename supplied.
  40. Date and time is in MSDOS format.  It assumes the existence of a function
  41. gettz() that returns the the difference (localtime - gmt) in seconds.
  42. */
  43. int setutime(path,date,time)
  44. char *path;
  45. unsigned int date, time;
  46. {
  47.    int year, month, day, hour, min, sec, daycount;
  48.    long longtime; 
  49.    /* no. of days to beginning of month for each month */
  50.    static int dsboy[12] = { 0, 31, 59, 90, 120, 151, 181, 212,
  51.                               243, 273, 304, 334};
  52.  
  53.    /* part of following code is common to zoolist.c -- if memory 
  54.    space is tight, try to share the code */
  55.    year  =  (((unsigned int) date >> 9) & 0x7f) + 1980;
  56.    month =  ((unsigned int) date >> 5) & 0x0f;
  57.    day   =  date        & 0x1f;
  58.  
  59.    hour =  ((unsigned int) time >> 11)& 0x1f;
  60.    min   =  ((unsigned int) time >> 5) & 0x3f;
  61.    sec   =  ((unsigned int) time & 0x1f) * 2;
  62.  
  63. #ifdef DEBUG
  64.    printf (setutime:  "year=%d  month=%d  day=%d  hour=%d  min=%d  sec=%d\n",
  65.            year, month, day, hour, min, sec);
  66. #endif
  67.  
  68.    /* Calculate days since 1970/01/01 */
  69.    daycount = 365 * (year - 1970) +    /* days due to whole years */
  70.                (year - 1970) / 4 +     /* days due to leap years */
  71.                dsboy[month-1] +        /* days since beginning of this year */
  72.                day-1;                  /* days since beginning of month */
  73.  
  74.    if (year % 4 == 0 && 
  75.        year % 400 != 0 && month >= 3)  /* if this is a leap year and month */
  76.       daycount++;                      /* is March or later, add a day */
  77.  
  78.    /* Knowing the days, we can find seconds */
  79.    longtime = daycount * 24L * 60L * 60L    +
  80.           hour * 60L * 60L   +   min * 60   +    sec;
  81.  
  82.    longtime = longtime + gettz();      /* adjust for timezone */
  83.  
  84.    /* special case:  if MSDOS format date and time were zero, then we set
  85.    time to be zero here too. */
  86.    if (date == 0 && time == 0)
  87.       longtime = 0;
  88.  
  89.    /* longtime is now the time of the file, in seconds, since
  90.    1970/01/01 00:00:00.  Now we set both access and modification times */
  91.    {
  92.       long utimbuf[2];
  93.       utimbuf[0] = utimbuf[1] = longtime;
  94.       return (utime (path, utimbuf));
  95.    }
  96. }
  97.